package jp.co.neosystem.adwg.neodiary.activity;

import static jp.co.neosystem.adwg.neodiary.util.Constants.INTENT_KEY_EDITTEXT_CONTENT;
import static jp.co.neosystem.adwg.neodiary.util.Constants.INTENT_KEY_EDITTEXT_DATE;
import static jp.co.neosystem.adwg.neodiary.util.Constants.INTENT_KEY_EDITTEXT_TITLE;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import jp.co.neosystem.adwg.neodiary.R;
import jp.co.neosystem.adwg.neodiary.db.dao.DiaryDao;
import jp.co.neosystem.adwg.neodiary.db.entity.Diary;
import jp.co.neosystem.adwg.neodiary.db.util.OrderByMap;
import jp.co.neosystem.adwg.neodiary.db.util.OrderByMap.SortKind;
import jp.co.neosystem.adwg.neodiary.db.util.WhereMap;
import jp.co.neosystem.adwg.neodiary.view.listview.adapter.SearchResultListAdapter;
import jp.co.neosystem.adwg.neodiary.view.listview.bean.SearchResultListBean;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;

/**
 * 確認画面用Activity
 * 
 * @author NEOSystem
 */
public class SearchActivity extends Activity
{
	/** 新規ボタン */
	private Button buttonNew;
	/** 検索ボタン */
	private Button buttonSearch;
	/** 終了ボタン */
	private Button buttonClose;
	/** クリアボタン */
	private Button buttonClearDate;
	/** カレンダーボタン */
	private ImageButton imageButtonCalendar;
	/** 検索結果リストビュー */
	private ListView listViewSearchResult;
	/** 日付エディットボックス */
	private EditText editTextDate;
	/** タイトルエディットボックス */
	private EditText editTextTitle;
	/** 日付選択ダイアログ */
	private DatePickerDialog datePickerDialog;

	/**
	 * onCreateメソッド
	 * 
	 * @param savedInstanceState
	 */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// 各ウィジェットのインスタンス取得
		buttonNew = (Button) findViewById(R.id.buttonNew);
		buttonSearch = (Button) findViewById(R.id.buttonSearch);
		buttonClose = (Button) findViewById(R.id.buttonClose);
		buttonClearDate = (Button) findViewById(R.id.buttonClearDate);
		imageButtonCalendar = (ImageButton) findViewById(R.id.imageButtonCalendar);
		listViewSearchResult = (ListView) findViewById(R.id.listViewSearchResult);
		editTextDate = (EditText) findViewById(R.id.editTextDate);
		editTextTitle = (EditText) findViewById(R.id.editTextTitle);

		// 各ウィジェットのリスナーセット
		buttonNew.setOnClickListener(new OnClickListener4ButtonNew());
		buttonSearch.setOnClickListener(new OnClickListener4ButtonSearch());
		buttonClose.setOnClickListener(new OnClickListener4ButtonClose());
		buttonClearDate.setOnClickListener(new OnClickListener4ButtonClearDate());
		imageButtonCalendar.setOnClickListener(new OnClickListener4ImageButtonCalendar());
		listViewSearchResult.setOnItemClickListener(new OnItemClickListener4ListViewSearchResult());
	}

	/**
	 * 新規ボタン用クリックリスナー
	 * 
	 * @author NEOSystem
	 */
	private class OnClickListener4ButtonNew implements OnClickListener
	{
		/**
		 * クリック時処理
		 * 
		 * @param view
		 */
		public void onClick(View view)
		{
			Intent intent = new Intent(SearchActivity.this, RegistActivity.class);
			startActivity(intent);
		}
	}

	/**
	 * 検索ボタン用クリックリスナー
	 * 
	 * @author NEOSystem
	 */
	private class OnClickListener4ButtonSearch implements OnClickListener
	{
		/**
		 * クリック時処理
		 * 
		 * @param view
		 */
		public void onClick(View view)
		{
			String date = editTextDate.getText().toString();
			String title = editTextTitle.getText().toString();

			DiaryDao dao = new DiaryDao(view.getContext());
			WhereMap whereMap = new WhereMap();
			whereMap.put(Diary.COLUMN_NAME_DATE, date);
			whereMap.put(Diary.COLUMN_NAME_TITLE, title);
			OrderByMap orderByMap = new OrderByMap();
			orderByMap.put(Diary.COLUMN_NAME_DATE, SortKind.DESC);

			List<Diary> diarys = dao.select(whereMap, orderByMap);
			if (diarys == null)
			{
				// TODO アラート処理
				return;
			}

			// リストビューのアダプタを生成し、検索結果をセット
			List<SearchResultListBean> list = new ArrayList<SearchResultListBean>();
			for (Diary diary : diarys)
			{
				SearchResultListBean bean = new SearchResultListBean();
				bean.setDate(diary.getDate());
				bean.setTitle(diary.getTitle());
				list.add(bean);
			}
			listViewSearchResult.setAdapter(new SearchResultListAdapter(SearchActivity.this, list));
		}
	}

	/**
	 * 終了ボタン用クリックリスナー
	 * 
	 * @author NEOSystem
	 */
	private class OnClickListener4ButtonClose implements OnClickListener
	{
		/**
		 * クリック時処理
		 * 
		 * @param view
		 */
		public void onClick(View view)
		{
			finish();
		}
	}

	/**
	 * クリアボタン用クリックリスナー
	 * 
	 * @author NEOSystem
	 */
	private class OnClickListener4ButtonClearDate implements OnClickListener
	{
		/**
		 * クリック時処理
		 * 
		 * @param view
		 */
		public void onClick(View view)
		{
			editTextDate.setText(null);
		}
	}

	/**
	 * カレンダーボタン用クリックリスナー
	 * 
	 * @author NEOSystem
	 */
	private class OnClickListener4ImageButtonCalendar implements OnClickListener
	{
		/**
		 * クリック時処理
		 * 
		 * @param view
		 */
		public void onClick(View view)
		{
			// 日付情報の初期設定
			Calendar calendar = Calendar.getInstance();
			int year = calendar.get(Calendar.YEAR);
			int monthOfYear = calendar.get(Calendar.MONTH);
			int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);

			datePickerDialog = new DatePickerDialog(view.getContext(), new OnDateSetListener4DatePickerDialog(), year, monthOfYear, dayOfMonth);
			datePickerDialog.show();
		}
	}

	/**
	 * 検索結果リストビュー用クリックリスナー
	 * 
	 * @author NEOSystem
	 */
	private class OnItemClickListener4ListViewSearchResult implements OnItemClickListener
	{
		/**
		 * クリック時処理
		 * 
		 * @param parent
		 * @param view
		 * @param position
		 * @param id
		 */
		public void onItemClick(AdapterView<?> parent, View view, int position, long id)
		{
			ListView listView = (ListView) parent;
			SearchResultListBean bean = (SearchResultListBean) listView.getItemAtPosition(position);

			DiaryDao dao = new DiaryDao(SearchActivity.this);
			WhereMap whereMap = new WhereMap();
			whereMap.put(Diary.COLUMN_NAME_DATE, bean.getDate());
			whereMap.put(Diary.COLUMN_NAME_TITLE, bean.getTitle());
			List<Diary> diary = dao.select(whereMap, null);

			// 詳細表示画面へ遷移
			Intent intent = new Intent(SearchActivity.this, DetailActivity.class);
			intent.putExtra(INTENT_KEY_EDITTEXT_DATE.toString(), bean.getDate());
			intent.putExtra(INTENT_KEY_EDITTEXT_TITLE.toString(), bean.getTitle());
			intent.putExtra(INTENT_KEY_EDITTEXT_CONTENT.toString(), diary.get(0).getContent());
			startActivity(intent);

			// ListView listView = (ListView) parent;
			// String date = ((String)
			// listView.getItemAtPosition(position)).split("   ")[0];
			// String title = ((String)
			// listView.getItemAtPosition(position)).split("   ")[1];
			//
			// Log.d(this.getClass().getSimpleName(), "date  [" + date + "]");
			// Log.d(this.getClass().getSimpleName(), "title [" + title + "]");
			//
			// DiaryDao dao = new DiaryDao(view.getContext());
			// WhereMap whereMap = new WhereMap();
			// whereMap.put(Diary.COLUMN_NAME_DATE, date);
			// whereMap.put(Diary.COLUMN_NAME_TITLE, title);
			// List<Diary> diary = dao.select(whereMap, null);
			//
			// // 詳細表示画面へ遷移
			// Intent intent = new Intent(SearchActivity.this,
			// DetailActivity.class);
			// intent.putExtra(INTENT_KEY_EDITTEXT_DATE.toString(), date);
			// intent.putExtra(INTENT_KEY_EDITTEXT_TITLE.toString(), title);
			// intent.putExtra(INTENT_KEY_EDITTEXT_CONTENT.toString(),
			// diary.get(0).getContent());
			// startActivity(intent);
		}
	}

	/**
	 * 日付選択ダイアログ用データセットリスナー
	 * 
	 * @author NEOSystem
	 */
	private class OnDateSetListener4DatePickerDialog implements OnDateSetListener
	{
		/**
		 * データセット処理
		 * 
		 * @param view
		 * @param year
		 * @param monthOfYear
		 * @param dayOfMonth
		 */
		public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
		{
			// monthOfYearは実際の値より1減算された値が返ってくるので、1加算しておく
			editTextDate.setText(year + "/" + (monthOfYear + 1) + "/" + dayOfMonth);
		}
	}
}